home *** CD-ROM | disk | FTP | other *** search
- /* ----------- console.c ---------- */
-
- #include <conio.h>
- #include <bios.h>
- #include <dos.h>
- #include "system.h"
- #include "keys.h"
-
- /* ----- table of alt keys for finding shortcut keys ----- */
- char altconvert[] = {
- ALT_A,ALT_B,ALT_C,ALT_D,ALT_E,ALT_F,ALT_G,ALT_H,
- ALT_I,ALT_J,ALT_K,ALT_L,ALT_M,ALT_N,ALT_O,ALT_P,
- ALT_Q,ALT_R,ALT_S,ALT_T,ALT_U,ALT_V,ALT_W,ALT_X,
- ALT_Y,ALT_Z,ALT_0,ALT_1,ALT_2,ALT_3,ALT_4,ALT_5,
- ALT_6,ALT_7,ALT_8,ALT_9,0
- };
-
- unsigned video_mode;
- unsigned video_page;
-
- static int near cursorpos[MAXSAVES];
- static int near cursorshape[MAXSAVES];
- static int cs = 0;
-
- static union REGS regs;
-
- #ifndef MSC
- #define ZEROFLAG 0x40
- /* ---- Test for keystroke ---- */
- int keyhit(void)
- {
- _AH = 1;
- geninterrupt(KEYBRD);
- return (_FLAGS & ZEROFLAG) == 0;
- }
- #endif
-
- /* ---- Read a keystroke ---- */
- int getkey(void)
- {
- int c;
- while (keyhit() == 0)
- ;
- if (((c = bioskey(0)) & 0xff) == 0)
- c = (c >> 8) | 0x80;
- return c & 0xff;
- }
-
- /* ---------- read the keyboard shift status --------- */
- int getshift(void)
- {
- regs.h.ah = 2;
- int86(KEYBRD, ®s, ®s);
- return regs.h.al;
- }
-
- /* ------- macro to wait one clock tick -------- */
- #define wait() \
- { \
- int now = peek(0x40,0x6c); \
- while (now == peek(0x40,0x6c)) \
- ; \
- }
-
- /* -------- sound a buzz tone ---------- */
- void beep(void)
- {
- wait();
- outp(0x43, 0xb6); /* program the frequency */
- outp(0x42, (int) (COUNT % 256));
- outp(0x42, (int) (COUNT / 256));
- outp(0x61, inp(0x61) | 3); /* start the sound */
- wait();
- outp(0x61, inp(0x61) & ~3); /* stop the sound */
- }
-
- /* -------- get the video mode and page from BIOS -------- */
- void videomode(void)
- {
- regs.h.ah = 15;
- int86(VIDEO, ®s, ®s);
- video_mode = regs.h.al;
- video_page = regs.x.bx;
- video_page &= 0xff00;
- video_mode &= 0x7f;
- }
-
- /* ------ position the cursor ------ */
- void cursor(int x, int y)
- {
- videomode();
- regs.x.dx = ((y << 8) & 0xff00) + x;
- regs.x.ax = 0x0200;
- regs.x.bx = video_page;
- int86(VIDEO, ®s, ®s);
- }
-
- /* ------ get cursor shape and position ------ */
- static void near getcursor(void)
- {
- videomode();
- regs.h.ah = READCURSOR;
- regs.x.bx = video_page;
- int86(VIDEO, ®s, ®s);
- }
-
- /* ------- get the current cursor position ------- */
- void curr_cursor(int *x, int *y)
- {
- getcursor();
- *x = regs.h.dl;
- *y = regs.h.dh;
- }
-
- /* ------ save the current cursor configuration ------ */
- void savecursor(void)
- {
- if (cs < MAXSAVES) {
- getcursor();
- cursorshape[cs] = regs.x.cx;
- cursorpos[cs] = regs.x.dx;
- cs++;
- }
- }
-
- /* ---- restore the saved cursor configuration ---- */
- void restorecursor(void)
- {
- if (cs) {
- --cs;
- videomode();
- regs.x.dx = cursorpos[cs];
- regs.h.ah = SETCURSOR;
- regs.x.bx = video_page;
- int86(VIDEO, ®s, ®s);
- set_cursor_type(cursorshape[cs]);
- }
- }
-
- /* ------ make a normal cursor ------ */
- void normalcursor(void)
- {
- set_cursor_type(0x0607);
- }
-
- /* ------ hide the cursor ------ */
- void hidecursor(void)
- {
- getcursor();
- regs.h.ch |= HIDECURSOR;
- regs.h.ah = SETCURSORTYPE;
- int86(VIDEO, ®s, ®s);
- }
-
- /* ------ unhide the cursor ------ */
- void unhidecursor(void)
- {
- getcursor();
- regs.h.ch &= ~HIDECURSOR;
- regs.h.ah = SETCURSORTYPE;
- int86(VIDEO, ®s, ®s);
- }
-
- /* ---- use BIOS to set the cursor type ---- */
- void set_cursor_type(unsigned t)
- {
- videomode();
- regs.h.ah = SETCURSORTYPE;
- regs.x.bx = video_page;
- regs.x.cx = t;
- int86(VIDEO, ®s, ®s);
- }